home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / tenex.zip / TENEX.C < prev    next >
C/C++ Source or Header  |  1988-09-07  |  5KB  |  267 lines

  1. /*
  2.  * TENEX convert - convert tenex 36-bit files into standard 8-bit
  3.  *    byte stream by discarding every 9th nibble (hopefully its zero).
  4.  *    Also convert TENEX 7-bit ASCII to standard 8-bit byte ASCII by
  5.  *    discarding every 36th bit.
  6.  *
  7.  *    Written by Daniel Ts'o, dan@rna.rockefeller.edu, 9/7/88
  8.  *
  9.  *    Usage: tenex [-[t|b]] [-[v|q]] [files...]
  10.  *
  11.  *    -t    Convert 5x7bit ASCII (35+1bit packing) into 8-bit byte stream
  12.  *    -b    Convert 4*8bit binary (32+4bit packing) into 8-bit byte stream
  13.             (Default is -b)
  14.  *    -v    Print progress on stderr
  15.  *    -q    Quietly delete nonzero bits
  16.  *
  17.  *    If file arguments are given, they are converted "in place", using
  18.  *        temporary file "tenex.tmp".
  19.  *    If file arguments are missing, convert stdin to stdout (filter mode).
  20.  *
  21.  *    Compile with MSC 5.0 on MSDOS:
  22.  *
  23.  *        cl tenex.c \lib\setargv.obj /link /NOE
  24.  *
  25.  *    to permit wildcard expansion.
  26.  */
  27.  
  28. #include <stdio.h>
  29.  
  30. #define    TEMPFILE    "tenex.tmp"
  31.  
  32. /*#define    RENAME            /* Some UNIX's don't have rename() */
  33.  
  34. #ifdef    MSDOS
  35. #define    READMODE    "rb"
  36. #define    WRITEMODE    "wb"
  37. #include <fcntl.h>
  38. #include <io.h>
  39. #else
  40. #define    READMODE    "r"
  41. #define    WRITEMODE    "w"
  42. #endif
  43.  
  44. char *nodename;
  45. int vflag = 0;
  46. int qflag = 0;
  47. int tflag = 0;
  48.  
  49. main(c,v)
  50. char **v;
  51. {
  52.     register int i,f;
  53.     FILE *ifd, *ofd;
  54.     char ibuf[BUFSIZ];
  55.     char obuf[BUFSIZ];
  56.  
  57.     f = 0;
  58.     nodename = *v;
  59.     setbuf(stdin, ibuf);
  60.     setbuf(stdout, obuf);
  61.     while (c > 1 && v[1][0] == '-') {
  62.         c--;
  63.         v++;
  64.         switch (v[0][1]) {
  65.         case 'v':
  66.             vflag++;
  67.             break;
  68.         case 'q':
  69.             qflag++;
  70.             break;
  71.         case 't':
  72.             tflag++;
  73.             break;
  74.         case 'b':
  75.             tflag = 0;
  76.             break;
  77.         default:
  78.             fprintf(stderr, "%s:%s: Bad option\n", nodename, *v);
  79.             exit(-1);
  80.         }
  81.     }
  82.  
  83. #ifdef    MSDOS
  84.     if (setmode(fileno(stdin), O_BINARY) == -1
  85.         || setmode(fileno(stdout), O_BINARY) == -1) {
  86.         fprintf(stderr, "%s: Cannot setmode on stdio\n", nodename);
  87.         exit(1);
  88.     }
  89. #endif
  90.  
  91.     if (--c <= 0)
  92.         exit(xfer(stdin, stdout, "(stdin)"));
  93.     else {
  94.         while (c--) {
  95.             v++;
  96.             if (**v == '-' && v[0][1] == 0) {
  97.                 xfer(stdin, stdout, "(stdin)");
  98.                 clearerr(stdin);
  99.             }
  100.             else {
  101.                 unlink(TEMPFILE);
  102.                 if ((ifd = fopen(*v, READMODE)) == NULL) {
  103.                     fprintf(stderr, "%s: %s: Can't open\n",
  104.                         nodename, *v);
  105.                     f++;
  106.                     break;
  107.                 }
  108.                 else if ((ofd = fopen(TEMPFILE, WRITEMODE))
  109.                     == NULL) {
  110.                     fprintf(stderr, "%s: %s: Can't open\n",
  111.                         nodename, TEMPFILE);
  112.                     f++;
  113.                     break;
  114.                 }
  115.                 else if (xfer(ifd, ofd, *v) == 0) {
  116.                     fclose(ifd);
  117.                     fclose(ofd);
  118.                     if (unlink(*v)) {
  119.                         fprintf(stderr,
  120.                         "%s: %s: Can't unlink\n",
  121.                         nodename, *v);
  122.                         f++;
  123.                         break;
  124.                     }
  125.                     if (rename(TEMPFILE, *v)) {
  126.                         fprintf(stderr,
  127.                         "%s: %s: Can't rename\n",
  128.                         nodename, *v);
  129.                         f++;
  130.                         break;
  131.                     }
  132.                 }
  133.             }
  134.         }
  135.     }
  136.     exit(f ? -1 : 0);
  137. }
  138.  
  139. xfer(ifd, ofd, name)
  140. FILE *ifd;
  141. FILE *ofd;
  142. char *name;
  143. {
  144.     if (vflag) {
  145.         fprintf(stderr, "%s: %s", nodename, name);
  146.         if (tflag)
  147.             fprintf(stderr, " (text mode)\n");
  148.         else
  149.             fprintf(stderr, " (binary mode)\n");
  150.     }
  151.     if (tflag)
  152.         return txfer(ifd, ofd, name);
  153.     else
  154.         return bxfer(ifd, ofd, name);
  155. }
  156.  
  157. bxfer(ifd, ofd, name)
  158. FILE *ifd;
  159. FILE *ofd;
  160. char *name;
  161. {
  162.     register int icnt, ocnt, ncnt, ci, co, c;
  163.  
  164.     icnt = 0;
  165.     ocnt = 0;
  166.     ncnt = 0;
  167.     co = ci = c = 0;
  168.     for (;;) {
  169.         if (icnt <= 0) {
  170.             if ((ci = getc(ifd)) == EOF) {
  171.                 if (ocnt > 0) {
  172.                     fprintf(stderr, "%s: 0x%x: Warning, unpaired ending nibble in file %s\n", nodename, co, name);
  173.                     putc(co, ofd);
  174.                 }
  175.                 break;
  176.             }
  177.             else {
  178.                 icnt = 1;
  179.                 c = ci>>4;
  180.             }
  181.         }
  182.         else {
  183.             icnt = 0;
  184.             c = ci&017;
  185.         }
  186.         if (++ncnt >= 9) {
  187.             ncnt = 0;
  188.             if (c != 0 && !qflag)
  189.                 fprintf(stderr, "%s: 0x%x: Warning, nonzero nibble discarded from file %s\n", nodename, c, name);
  190.             continue;
  191.         }
  192.         if (++ocnt >= 2) {
  193.             co |= c;
  194.             putc(co, ofd);
  195.             if (ferror(ofd))
  196.                 break;
  197.             co = 0;
  198.             ocnt = 0;
  199.         }
  200.         else
  201.             co |= c<<4;
  202.     }
  203.     fflush(ofd);
  204. }
  205.  
  206. txfer(ifd, ofd, name)
  207. FILE *ifd;
  208. FILE *ofd;
  209. char *name;
  210. {
  211.     register int icnt, ocnt, ncnt, ci, co, c;
  212.  
  213.     icnt = 0;
  214.     ocnt = 0;
  215.     ncnt = 0;
  216.     co = ci = c = 0;
  217.     for (;;) {
  218.         if (icnt <= 0) {
  219.             if ((ci = getc(ifd)) == EOF) {
  220.                 if (ocnt > 0) {
  221.                     fprintf(stderr, "%s: 0x%x: Warning, incomplete ending byte in file %s\n", nodename, co, name);
  222.                     putc(co, ofd);
  223.                 }
  224.                 break;
  225.             }
  226.             else {
  227.                 ci &= 0377;
  228.                 icnt = 7;
  229.                 c = ci>>7;
  230.             }
  231.         }
  232.         else {
  233.             icnt--;
  234.             c = (ci>>icnt)&1;
  235.         }
  236.         if (++ncnt >= 36) {
  237.             ncnt = 0;
  238.             if (c != 0 && !qflag)
  239.                 fprintf(stderr, "%s: Warning, nonzero bit discarded from file %s\n", nodename, name);
  240.             continue;
  241.         }
  242.         if (++ocnt >= 7) {
  243.             co |= c;
  244.             putc(co, ofd);
  245.             if (ferror(ofd))
  246.                 break;
  247.             co = 0;
  248.             ocnt = 0;
  249.         }
  250.         else
  251.             co |= c<<(7-ocnt);
  252.     }
  253.     fflush(ofd);
  254. }
  255.  
  256. #ifdef    RENAME
  257. rename(a, b)
  258. char *a, *b;
  259. {
  260.     register int f;
  261.  
  262.     if (f = link(a, b))
  263.         return f;
  264.     return unlink(a);
  265. }
  266. #endif
  267.